Современная оптимизация — это партнерство между выбором алгоритмов высокого уровня и пониманием работы аппаратного обеспечения на низком уровне. В то время как асимптотическая эффективность определяет теоретические границы, а императив производительности требует от нас решать константные факторы которые компиляторы не могут обработать самостоятельно.
1. Иерархия оптимизации
Успех следует линейному процессу: во-первых, устраните асимптотическую неэффективность (например, $O(N^2) \to O(N)$). Далее — решайте препятствия оптимизации— в первую очередь алиасинг памяти и накладные расходы при вызове процедур (например, постоянная проверка границ в функции get_vec_element).
2. Поток данных и ограничения
Компиляторы действуют осторожно ради безопасности; они не будут оптимизировать код, если указатель *dest может пересекаться с вектором data. Мы измеряем реальную скорость выполнения посредством циклов на элемент (CPE). Производительность часто моделируется с помощью коэффициентов масштабирования, таких как $\alpha = 0.974$, где накладные расходы смещают кривую выполнения (например, $209/\alpha = 39.0$).
3. Реальности аппаратного обеспечения
Оптимизация требует понимания единицы завершения (Retirement Unit) и критического пути. Даже простые циклы ограничены ограничением пропускной способности функциональных блоков или ограничением задержки цепочек зависимостей.